package com.kaifamiao.strings;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

/**
 * 1、编码(encode): 就是将 字符序列 按照特定字符集 转换为 字节序列
 * 2、解码(decode): 就是将 字节序列 按照特定字符集 转换为 字符序列
 */
public class StringsEncoding {

    public static void main(String[] args) {

        System.out.println( "平台默认字符集: " + Charset.defaultCharset() );

        // 一个字符串就是一个 字符序列 (char sequence)
        String source = "开发喵";

        // 使用 平台默认字符集 将 字符串 【编码】为 byte 序列，并将结果存储到一个新的 byte 数组中
        byte[] bytes = source.getBytes();
        System.out.println( bytes.length );
        System.out.println( Arrays.toString( bytes ) );

        Charset utf8 = Charset.forName( "UTF-8" );
        // 使用给定的 charset 将 字符串 【编码】到 byte 序列，并将结果存储到新的 byte 数组
        bytes = source.getBytes( utf8 ); // getBytes(Charset)
        System.out.println( Arrays.toString( bytes ) );

        bytes = source.getBytes(StandardCharsets.UTF_8); // getBytes(Charset)
        System.out.println( Arrays.toString( bytes ) );

        System.out.println( "- ".repeat( 20 ) );

        // 在字节数组中存储的是根据 UTF-8 编码得到的字节序列
        byte[] byteSequence = { -27, -68, -128, -27, -113, -111, -27, -106, -75 };

        // 用 平台默认字符集 将指定的 byte 数组 【解码】为 字符序列(即构造一个新的String实例)
        String encoded = new String( byteSequence );
        System.out.println( encoded );

        // 用指定的 charset 将指定的 byte 数组 【解码】为 字符序列(即构造一个新的String实例)
        encoded = new String( byteSequence, Charset.forName("UTF-8") ); // String(byte[], Charset)
        System.out.println( encoded );

        encoded = new String( byteSequence, StandardCharsets.UTF_8 ); // String(byte[], Charset)
        System.out.println( encoded );

        // String(byte[] bytes, int offset, int length, Charset cs)
        String x = new String(byteSequence, 6, 3 , StandardCharsets.UTF_8);
        System.out.println( x );

    }

}
